package vavi.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ARGBChooserPanel extends AbstractColorChooserPanel implements ChangeListener {

    protected JSlider redSlider;
    protected JSlider greenSlider;
    protected JSlider blueSlider;
    protected JSlider alphaSlider;
    protected JSpinner redSpinner;
    protected JSpinner blueSpinner;
    protected JSpinner greenSpinner;
    protected JSpinner alphaSpinner;

    private final int minValue = 0;
    private final int maxValue = 255;

    private boolean isAdjusting = false;

    public ARGBChooserPanel() {
        super();
    }

    private void setColor(Color color) {
        int red = color.getRed();
        int blue = color.getBlue();
        int green = color.getGreen();
        int alpha = color.getAlpha();

        if (redSlider.getValue() != red) {
            redSlider.setValue(red);
        }
        if (greenSlider.getValue() != green) {
            greenSlider.setValue(green);
        }
        if (blueSlider.getValue() != blue) {
            blueSlider.setValue(blue);
        }
        if (alphaSlider.getValue() != alpha) {
            alphaSlider.setValue(alpha);
        }


        if (((Integer)redSpinner.getValue()).intValue() != red) {
            redSpinner.setValue(new Integer(red));
	}
        if (((Integer)greenSpinner.getValue()).intValue() != green) {
            greenSpinner.setValue(new Integer(green));
	}
        if (((Integer)blueSpinner.getValue()).intValue() != blue) {
            blueSpinner.setValue(new Integer(blue));
	}
        if (((Integer)alphaSpinner.getValue()).intValue() != alpha) {
            alphaSpinner.setValue(new Integer(alpha));
	}
    }
    
    public String getDisplayName() {
        return "ARGB";
    }

    public Icon getSmallDisplayIcon() {
        return null;
    }

    public Icon getLargeDisplayIcon() {
        return null;
    }
       
    protected void buildChooser() {
      
        setLayout(new BorderLayout());
        Color color = getColorFromModel();

        JPanel panel = new JPanel();
        GridBagLayout layout = new GridBagLayout();
        GridBagConstraints con = new GridBagConstraints();
        panel.setLayout(layout);

        add(panel, BorderLayout.CENTER);

        JLabel l = new JLabel("Red");
        con.gridwidth = 1;
        layout.setConstraints(l, con);
        panel.add(l);
        redSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getRed());
        redSlider.setMajorTickSpacing(85);
        redSlider.setMinorTickSpacing(17);
        redSlider.setPaintTicks(true);
        redSlider.setPaintLabels(true);
        layout.setConstraints(redSlider, con);
        l.setLabelFor(redSlider);
        panel.add(redSlider);
        redSpinner = new JSpinner(
            new SpinnerNumberModel(color.getRed(), minValue, maxValue, 1));
        JPanel redSpinnerHolder = new JPanel(new FlowLayout());
        redSpinner.addChangeListener(this);
        redSpinnerHolder.add(redSpinner);
        con.gridwidth = GridBagConstraints.REMAINDER;
        layout.setConstraints(redSpinnerHolder, con);
        panel.add(redSpinnerHolder);

        l = new JLabel("Green");
        con.gridwidth = 1;
        layout.setConstraints(l, con);
        panel.add(l);
        greenSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getGreen());
        greenSlider.setMajorTickSpacing(85);
        greenSlider.setMinorTickSpacing(17);
        greenSlider.setPaintTicks(true);
        greenSlider.setPaintLabels(true);
        layout.setConstraints(greenSlider, con);
        panel.add(greenSlider);
        greenSpinner = new JSpinner(
            new SpinnerNumberModel(color.getGreen(), minValue, maxValue, 1));
        l.setLabelFor(greenSlider);
        JPanel greenSpinnerHolder = new JPanel(new FlowLayout());
        greenSpinnerHolder.add(greenSpinner);
        greenSpinner.addChangeListener(this);
        con.gridwidth = GridBagConstraints.REMAINDER;
        layout.setConstraints(greenSpinnerHolder, con);
        panel.add(greenSpinnerHolder);

        l = new JLabel("Blue");
        con.gridwidth = 1;
        layout.setConstraints(l, con);
        panel.add(l);
        blueSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getBlue());
        blueSlider.setMajorTickSpacing(85);
        blueSlider.setMinorTickSpacing(17);
        blueSlider.setPaintTicks(true);
        blueSlider.setPaintLabels(true);
        layout.setConstraints(blueSlider, con);
        panel.add(blueSlider);
        blueSpinner = new JSpinner(
            new SpinnerNumberModel(color.getBlue(), minValue, maxValue, 1));
        l.setLabelFor(blueSlider);
        JPanel blueSpinnerHolder = new JPanel(new FlowLayout());
        blueSpinnerHolder.add(blueSpinner);
        blueSpinner.addChangeListener(this);
        con.gridwidth = GridBagConstraints.REMAINDER;
        layout.setConstraints(blueSpinnerHolder, con);
        panel.add(blueSpinnerHolder);

        l = new JLabel("Alpha");
        con.gridwidth = 1;
        layout.setConstraints(l, con);
        panel.add(l);
        alphaSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, color.getAlpha());
        alphaSlider.setMajorTickSpacing(85);
        alphaSlider.setMinorTickSpacing(17);
        alphaSlider.setPaintTicks(true);
        alphaSlider.setPaintLabels(true);
        layout.setConstraints(alphaSlider, con);
        panel.add(alphaSlider);
        alphaSpinner = new JSpinner(
            new SpinnerNumberModel(color.getAlpha(), minValue, maxValue, 1));
        l.setLabelFor(alphaSlider);
        JPanel alphaSpinnerHolder = new JPanel(new FlowLayout());
        alphaSpinnerHolder.add(alphaSpinner);
        alphaSpinner.addChangeListener(this);
        con.gridwidth = GridBagConstraints.REMAINDER;
        layout.setConstraints(alphaSpinnerHolder, con);
        panel.add(alphaSpinnerHolder);

        redSlider.addChangeListener(this);
        greenSlider.addChangeListener(this);
        blueSlider.addChangeListener(this);  
        alphaSlider.addChangeListener(this);  
    }

    public void updateChooser() {
        if (!isAdjusting) {
            isAdjusting = true;

            setColor(getColorFromModel());

            isAdjusting = false;
        }
    }

    public void stateChanged(ChangeEvent e) {
        if (e.getSource() instanceof JSlider && !isAdjusting) {

            int red = redSlider.getValue();
            int green = greenSlider.getValue();
            int blue = blueSlider.getValue() ;
            int alpha = alphaSlider.getValue() ;
            Color color = new Color (red, green, blue, alpha);
    
            getColorSelectionModel().setSelectedColor(color);
        } else if (e.getSource() instanceof JSpinner && !isAdjusting) {

            int red = ((Integer)redSpinner.getValue()).intValue();
            int green = ((Integer)greenSpinner.getValue()).intValue();
            int blue = ((Integer)blueSpinner.getValue()).intValue();
            int alpha = ((Integer)alphaSpinner.getValue()).intValue();
            Color color = new Color (red, green, blue, alpha);
            
            getColorSelectionModel().setSelectedColor(color);
        }
    }

}


